package com.example.nonacademic_education.util;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.util.SaResult;
import com.example.nonacademic_education.constant.Constant;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * @author moon
 * @description 全局异常拦截
 * @date 2022/6/3
 */
@ControllerAdvice
public class GlobalExceptionAdvice {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public R exceptionHandler(Exception e){
        Map<String, Object> map = new HashMap<>();
        Integer code= Constant.ERROR_CODE;
        map.put("error", e.getMessage());
        map.put("status", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        map.put("exception", e.getClass().getName());
        map.put("timestamp", new Date());
        HttpServletRequest request = ((ServletRequestAttributes) (Objects.requireNonNull(RequestContextHolder.getRequestAttributes()))).getRequest();
        HttpServletResponse response = ((ServletRequestAttributes)(Objects.requireNonNull(RequestContextHolder.getRequestAttributes()))).getResponse();
        map.put("path", request.getRequestURI());
        Objects.requireNonNull(response).setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        String msg="程序异常: "+e.getMessage();
        if (e.getClass().getName().startsWith("cn.dev33.satoken.exception.NotLoginException")){
            code=Constant.TOKEN_ERROR_CODE;
            msg="登录过期";
        }else if (e.getClass().getName().startsWith("cn.dev33.satoken")){
            code=Constant.ERROR_CODE;
            msg="您的权限不足";
        }
        e.printStackTrace();
        return new R(code,map,msg);
    }
    // 全局异常拦截（拦截项目中的NotLoginException异常）
//    @ExceptionHandler(NotLoginException.class)
//    public SaResult handlerNotLoginException(NotLoginException nle)
//            throws Exception {
//
//        // 打印堆栈，以供调试
//        nle.printStackTrace();
//
//        // 判断场景值，定制化异常信息
//        String message = "";
//        if(nle.getType().equals(NotLoginException.NOT_TOKEN)) {
//            message = "未提供token";
//        }
//        else if(nle.getType().equals(NotLoginException.INVALID_TOKEN)) {
//            message = "token无效";
//        }
//        else if(nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) {
//            message = "token已过期";
//        }
//        else if(nle.getType().equals(NotLoginException.BE_REPLACED)) {
//            message = "token已被顶下线";
//        }
//        else if(nle.getType().equals(NotLoginException.KICK_OUT)) {
//            message = "token已被踢下线";
//        }
//        else {
//            message = "当前会话未登录";
//        }
//
//        // 返回给前端
//        return SaResult.error(message);
//    }
}
